草庐IT

c++ - Visual C++ volatile

全部标签

c++ - 标准在哪里定义 volatile 变量可以更改?

标准在哪里定义volatile变量可以改变未被发现?我找到了两个关于volatile的规范文本:intro.execution/7:Readinganobjectdesignatedbyavolatileglvalue([basic.lval]),modifyinganobject,callingalibraryI/Ofunction,orcallingafunctionthatdoesanyofthoseoperationsareallsideeffects,whicharechangesinthestateoftheexecutionenvironment.Evaluationof

c++ - 如何处理浮点计算中的超精度?

在我的数值模拟中,我有类似于以下片段的代码doublex;do{x=/*somecomputation*/;}while(x对于某些平台(例如linux、x87数学)上的某些编译器(例如gcc),可能会出现x以高于double的方式计算(“超精度”)。(更新:当我在这里谈论精度时,我指的是精度/和/范围。)在这些情况下,可以想象比较(x)返回false,即使下一次x被四舍五入降低到double,它变为0。(并且不能保证x不会在任意时间点向下舍入。)有什么方法可以执行这种比较是可移植的,在内联代码中工作,没有性能影响并且不排除一些任意范围(0,eps)?我尝试使用(x::denorm_m

c++ - C/C++ 编译器能否通过 pthread 库调用合法地将变量缓存在寄存器中?

假设我们有以下代码:#include#include#includevoidguarantee(boolcond,constchar*msg){if(!cond){fprintf(stderr,"%s",msg);exit(1);}}booldo_shutdown=false;//Notvolatile!pthread_cond_tshutdown_cond=PTHREAD_COND_INITIALIZER;pthread_mutex_tshutdown_cond_mutex=PTHREAD_MUTEX_INITIALIZER;/*CalledinThread1.Intendedbeh

c++ - 优化稳定的恒定时间数组比较

(注意:“恒定时间”是指当其中一个输入固定时机器周期的数量是恒定的,而不是O(1)。这是该术语在密码学上下文中的标准含义。)将一个固定值与一个相同大小的未知值进行比较的最常见方法是使用XOR循环:boolcompare(constchar*fixed,constchar*unknown,size_tn){charc=0;for(size_ti=0;iGCC4.6.3和CLANG3.0不会在AMD64上短路此循环,即使在-O3时也是如此(我检查了生成的机器代码)。但是,我不知道C标准中有什么会阻止一些聪明的编译器识别如果c永远不为零,那么该函数只能返回false.如果您愿意接受较大的性能

c++ - 通过指向常量的指针释放内存是一种好习惯吗

有很多问题讨论了C和C++处理常量指针删除的细节,即free()不接受它们,delete和delete[]执行并且常量性不会阻止对象销毁。我感兴趣的是您是否认为这样做是一种好的做法,而不是语言(C和C++)所允许的。删除常量指针的参数包括:LinusTorvalds的kfree()与C的free()不同,它采用voidconst*参数,因为他认为释放内存不影响指向的内容。free()是在引入const关键字之前设计的。C++的删除运算符允许删除常量数据。反对它的论点包括:程序员不希望在向数据传递指向常量的指针时修改(或删除)数据。许多人认为指向const的指针意味着不获得数据的所有权(

c++ - 编译器如何优化我们的代码?

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭12年前。我在回答另一个人的问题时遇到了这个问题。编译器如何优化代码?像const,...这样的关键字有帮助吗?除了使用volatiles和内联函数以及如何自行优化代码之外!

c++ - C和C++中的编译器优化和临时分配

请查看以下在C和C++中有效的代码:externintoutput;externintinput;externinterror_flag;voidfunc(void){if(0!=error_flag){output=-1;}else{output=input;}}是否允许编译器以与下面类似的方式编译上面的代码?externintoutput;externintinput;externinterror_flag;voidfunc(void){output=-1;if(0==error_flag){output=input;}}换句话说,是否允许编译器生成(从第一个片段开始)始终向out

c++ - 在 C/C++ 中,是否保证 volatile 变量在线程之间具有最终一致的语义?

是否有任何普遍遵循的标准(ISOC或C++,或任何POSIX/SUS规范)一个变量(也许标记为volatile),不受互斥量保护,正在被访问由多个线程将变得最终一致,如果它是分配给?举个具体的例子,考虑两个线程共享一个变量v,初始值为零。线程1:v=1线程2:同时(v==0)产量();是否保证线程2最终会终止?或者可以吗可以想象永远旋转,因为缓存一致性永远不会启动并使分配在线程2的缓存中可见?我知道C和C++标准(在C++0x之前)不在所有关于线程或并发。但我很好奇C++0x是否内存模型或pthreads或其他任何东西都可以保证这一点。(显然,这确实适用于32位x86的Windows;

c++ - 当一个成员函数是 volatile 时,这意味着什么?

这个问题在这里已经有了答案:WhatisthepurposeofavolatilememberfunctioninC++?(2个答案)关闭9年前。我通常看到const说明符用于指示const成员函数。但是,当使用volatile关键字时,这意味着什么?voidf()volatile{}这对我来说编译得很好,但我不明白这是干什么用的。我在搜索中找不到任何关于此的信息,因此非常感谢您的帮助。更新:为了清楚起见,我知道volatile的用途。我只是不知道在这种情况下这意味着什么。

c++ - 为什么 "volatileQualifiedExpr + volatileQualifiedExpr"在 C 中不一定是 UB 而在 C++ 中是?

当我今天阅读C标准时,它提到了副作用Accessingavolatileobject,modifyinganobject,modifyingafile,orcallingafunctionthatdoesanyofthoseoperationsareallsideeffectsC++标准说Accessinganobjectdesignatedbyavolatileglvalue(3.10),modifyinganobject,callingalibraryI/Ofunction,orcallingafunctionthatdoesanyofthoseoperationsareallsi